/*******************************************************************************
 * 版权：北京润尼尔网络科技有限公司，保留所有版权<br>
 * 版本：v1.0.0<br>
 * 文件：Interface.js<br>
 * 日期：2016年7月14日<br>
 * 作者: 王志远<br>
 * 功能：JS模拟Java接口实现<br>
 * 
 * 修改记录：<br>
 * 日期 描述 更新功能<br>
 ******************************************************************************/

;(function(){
	
	//定义名称空间变量
	var namespace = {};
	
	//创建名称空间:Rainier.Basic
	//根据NodeJS后端还是web前端判断应该创建名称空间的根对象
	if((typeof(window) !== "undefined")){
		makeNamespace(window,"Rainier.Basic");
		namespace = window.Rainier.Basic;
	}else{
		var Rainier = {};
		Rainier.Basic = {}; 
		namespace = Rainier.Basic;
	}
	
	/**
	 * 类型名称：Rainier.Basic.Interface<br>
	 * 类型功能：接口类定义，规范继承类的接口行为<br>
	 */
	namespace.Interface = function(sInterfaceName,saInterfaceMethods){
		
		//判断函数的参数个数是否为2，不等于2的情况下抛出异常
		if(arguments.length !== 2){
			throw new Error("The interface name or method list is not define.");
		}
		
		//添加接口名称和函数名称数组
		this.m_sInterName 		= sInterfaceName;
		this.m_saInterMethods 	= [];
		
		//为接口添加方法名称
		for(var i=0; i<saInterfaceMethods.length; i++){
			if(typeof saInterfaceMethods[i] !== "string"){
				throw new Error("The specified function name must be a string.");
			}
			
			this.m_saInterMethods.push(saInterfaceMethods[i]);
		}
	}
	
	
	/**
	 * 函数名称：Rainier.Basic.Interface.checkImplements<br>
	 * 函数功能：查看一个对象的接口实现情况<br>
	 * 参数输入：object 被检查接口实现情况的对象<br>
	 * 函数返回：无<br>
	 * 异常信息：Error<br>
	 */
	 namespace.Interface.checkImplements = function(object){
		
		if(arguments.length < 2){
			throw new Error("The function arguments must be > 2");
		}
		
		for(var i=1; i<arguments.length; i++){
			var inter = arguments[i];
			if(inter.constructor !== namespace.Interface){
				throw new Error("The constructor of a given class must be in agreement with the interface constructor.");
			}
			
			if(inter.m_saInterMethods){
				for(var j=0; j<inter.m_saInterMethods.length; j++){
					var method = inter.m_saInterMethods[j];
					if(!object[method] || typeof object[method] !== "function"){
						throw new Error("Does not fully implement the functions defined in the interface.");
					}
				}
			}
			
		}
	};
	
	if (typeof exports !== "undefined") {
		exports.Interface = namespace.Interface;
	} 
})();